#import "XMsg.h"

#import "XDefine.h"
#import "XMacro.h"
#import "iToast.h"
#import "XAlert.h"
#import "XLoading.h"
#import "XSelector.h"
#import "XApp.h"

static XMsg *g_Msg = nil;


// 默认标题
static NSString * const DEFAULT_TITLE               = @"温馨提示";

// 默认按钮
static NSString * const DEFAULT_BUTTON_OK           = @"确定";

// 按“确认”后返回上一级页面的 TAG
static NSInteger const DEFAULT_TAG_GOBACK           = -1709394;


@interface XMsg () <UIAlertViewDelegate> {
    BOOL                        m_bGoback;
}

@end


@implementation XMsg


/**
 * 显示消息框
 * 显示后，不作回调的处理
 * @param   msg             需要显示的消息，NSString类型
 * @param   title           需要显示消息的标题，NSString类型（可以为nil，当为nil时，标题将会显示为“温馨提示”）
 * @param   tag             消息框的标识
 * @param   ok              确定按钮的文字
 * @param   cancel          取消按钮的文字
 * @param   delegate        id<UIAlertViewDelegate> UIAlertView 回调对象，不回调：
 *                          - (void)willPresentAlertView:(UIAlertView *)alertView;
 *                          - (void)didPresentAlertView:(UIAlertView *)alertView;
 * @result
 */
- (void)showMessage:(NSString *)msg
          withTitle:(NSString *)title
                tag:(NSInteger)tag
                 ok:(NSString *)ok
             cancel:(NSString *)cancel
           delegate:(id/*<UIAlertViewDelegate>*/)delegate {
    if (!msg || !title || !ok) {
        NSLog(@"参数错误！");
        return;
    }
    
    if (X_CUSTOMMSGBOX) {
        XAlert *alert = [[XAlert alloc] initWithTitle:(nil == title) ? DEFAULT_TITLE : title
                                              message:msg
                                             delegate:delegate
                                    cancelButtonTitle:ok
                                    otherButtonTitles:cancel, nil];
        alert.tag = tag;
        [alert show];
    }
    else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:(nil == title) ? DEFAULT_TITLE : title
                                                        message:msg
                                                       delegate:delegate
                                              cancelButtonTitle:ok
                                              otherButtonTitles:cancel, nil];
        alert.tag = tag;
        [alert show];
    }
}


- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    int tag = alertView.tag;
    if (tag == DEFAULT_TAG_GOBACK) {
        [XApp popViewController];
    }
}


/**
 * 显示自动隐藏的消息（可定义位置及消失时长）
 * 显示消息后，渐隐消失，可定义出现的位置，消失前的时长
 * @param   msg             需要显示的消息，NSString类型
 * @param   align           Toast在垂直位置上的对齐方式，ToastAlign类型（上端对齐：AlignTop、垂直居中：AlignCenter、底端对齐：AlignBottom）
 * @param   left            基于对齐方式的基础上进行的向左偏移
 * @param   top             基于对齐方式的基础上进行的向上偏移
 * @param   duration        Toast在界面显示的时长，ToastDuration类型（长时间显示：DurationLong、正常显示：DurationNormal、短时间显示：DurationShort）
 * @result
 */
- (void)showToast:(NSString *)msg withGravity:(ToastAlignEnum)align offsetLeft:(NSInteger)left offsetTop:(NSInteger)top andDuration:(ToastDurationEnum)duration {
    iToastGravity g = iToastGravityBottom;
    switch ( align) {
        case AlignTop:
            g = iToastGravityTop;
            break;
        case AlignCenter:
            g = iToastGravityCenter;
            break;
        case AlignBottom:
            g = iToastGravityBottom;
            break;
            
        default:
            break;
    }
    [[[[iToast makeText:msg] setGravity:g offsetLeft:left offsetTop:top] setDuration:duration] show];
}


/**
 * 显示进度
 * 在对应的视图当中显示进度视图
 * @param   view            需要在其中显示进度的视图对象
 * @param   title           需要显示的提示文字信息，NSString类型
 * @result
 */
- (void)showProgressWithTitle:(NSString*)title {
    if (nil == title || title.length == 0) {
        [XLoading show];
    }
    else {
        [XLoading showWithTitle:title];
    }
}


/**
 * 隐藏进度
 * 隐藏对应的视图当何总显示的进度视图
 * @result
 */
- (void)hideProgress {
    [XLoading hide];
}


/**
 * 初始化默认的消息辅助业务类
 * @result                  MsgHelper 类型，单例 MsgHelper 对象
 */
+ (XMsg *)si {
    if (nil == g_Msg) {
        g_Msg = [[XMsg alloc] init];
    }
    
    return g_Msg;
}


/**
 * 显示消息框
 * 显示后，不作回调的处理
 * @param   msg             需要显示的消息，NSString类型，标题将会显示为“温馨提示”
 * @result
 */
+ (void)showMessage:(NSString *)msg {
    [[XMsg si] showMessage:msg withTitle:DEFAULT_TITLE tag:0 ok:DEFAULT_BUTTON_OK cancel:nil delegate:nil];
}


/**
 * 显示消息框
 * 显示后，不作回调的处理
 * @param   msg             需要显示的消息，NSString类型
 * @param   title           需要显示消息的标题，NSString类型（可以为nil，当为nil时，标题将会显示为“温馨提示”）
 * @result
 */
+ (void)showMessage:(NSString *)msg withTitle:(NSString *)title {
    [[XMsg si] showMessage:msg withTitle:title tag:0 ok:DEFAULT_BUTTON_OK cancel:nil delegate:nil];
}


/**
 * 显示消息框
 * 显示后，不作回调的处理
 * @param   msg             需要显示的消息，NSString类型
 * @param   title           需要显示消息的标题，NSString类型（可以为nil，当为nil时，标题将会显示为“温馨提示”）
 * @param   goback          标识点击“确认”后，是否返回上一界面，YES 为返回，NO 为不返回
 * @result
 */
+ (void)showMessage:(NSString *)msg withTitle:(NSString *)title andGoback:(BOOL)goback {
    XMsg *pMsg = [XMsg si];
    [pMsg showMessage:msg withTitle:title tag:DEFAULT_TAG_GOBACK ok:DEFAULT_BUTTON_OK cancel:nil delegate:pMsg];
}


/**
 * 显示消息框
 * 显示后，不作回调的处理
 * @param   msg             需要显示的消息，NSString类型
 * @param   title           需要显示消息的标题，NSString类型（可以为nil，当为nil时，标题将会显示为“温馨提示”）
 * @param   tag             消息框的标识
 * @param   delegate        id<UIAlertViewDelegate> UIAlertView 回调对象，不回调：
 *                          - (void)willPresentAlertView:(UIAlertView *)alertView;
 *                          - (void)didPresentAlertView:(UIAlertView *)alertView;
 * @result
 */
+ (void)showMessage:(NSString *)msg
          withTitle:(NSString *)title
                tag:(NSInteger)tag
           delegate:(id/*<UIAlertViewDelegate>*/)delegate {
    [[XMsg si] showMessage:msg withTitle:title tag:tag ok:DEFAULT_BUTTON_OK cancel:nil delegate:delegate];
}


/**
 * 显示消息框
 * 显示后，不作回调的处理
 * @param   msg             需要显示的消息，NSString类型
 * @param   title           需要显示消息的标题，NSString类型（可以为nil，当为nil时，标题将会显示为“温馨提示”）
 * @param   ok              确定按钮的文字
 * @param   cancel          取消按钮的文字
 * @result
 */
+ (void)showMessage:(NSString *)msg
          withTitle:(NSString *)title
                 ok:(NSString *)ok
             cancel:(NSString *)cancel {
    [[XMsg si] showMessage:msg withTitle:title tag:0 ok:ok cancel:cancel delegate:nil];
}


/**
 * 显示消息框
 * 显示后，不作回调的处理
 * @param   msg             需要显示的消息，NSString类型
 * @param   title           需要显示消息的标题，NSString类型（可以为nil，当为nil时，标题将会显示为“温馨提示”）
 * @param   tag             消息框的标识
 * @param   ok              确定按钮的文字
 * @param   cancel          取消按钮的文字
 * @param   delegate        id<UIAlertViewDelegate> UIAlertView 回调对象，不回调：
 *                          - (void)willPresentAlertView:(UIAlertView *)alertView;
 *                          - (void)didPresentAlertView:(UIAlertView *)alertView;
 * @result
 */
+ (void)showMessage:(NSString *)msg
          withTitle:(NSString *)title
                tag:(NSInteger)tag
                 ok:(NSString *)ok
             cancel:(NSString *)cancel
           delegate:(id/*<UIAlertViewDelegate>*/)delegate {
    [[XMsg si] showMessage:msg withTitle:title tag:tag ok:ok cancel:cancel delegate:delegate];
}


/**
 * 显示自动隐藏的消息
 * 显示消息后，渐隐消失（消息显示在下方，并且采用默认时长显示）
 * @param   msg             需要显示的消息，NSString类型
 * @result
 */
+ (void)showToast:(NSString *)msg {
    [[XMsg si] showToast:msg withGravity:AlignBottom offsetLeft:0 offsetTop:0 andDuration:DurationNormal];
}


/**
 * 显示自动隐藏的消息（可定义位置及消失时长）
 * 显示消息后，渐隐消失，可定义出现的位置，消失前的时长
 * @param   msg             需要显示的消息，NSString类型
 * @param   align           Toast在垂直位置上的对齐方式，ToastAlign类型（上端对齐：AlignTop、垂直居中：AlignCenter、底端对齐：AlignBottom）
 * @param   duration        Toast在界面显示的时长，ToastDuration类型（长时间显示：DurationLong、正常显示：DurationNormal、短时间显示：DurationShort）
 * @result
 */
+ (void)showToast:(NSString *)msg withGravity:(ToastAlignEnum)align andDuration:(ToastDurationEnum)duration {
    [[XMsg si] showToast:msg withGravity:align offsetLeft:0 offsetTop:0 andDuration:duration];
}


/**
 * 显示自动隐藏的消息（可定义位置及消失时长）
 * 显示消息后，渐隐消失，可定义出现的位置，消失前的时长
 * @param   msg             需要显示的消息，NSString类型
 * @param   align           Toast在垂直位置上的对齐方式，ToastAlign类型（上端对齐：AlignTop、垂直居中：AlignCenter、底端对齐：AlignBottom）
 * @param   left            基于对齐方式的基础上进行的向左偏移
 * @param   top             基于对齐方式的基础上进行的向上偏移
 * @param   duration        Toast在界面显示的时长，ToastDuration类型（长时间显示：DurationLong、正常显示：DurationNormal、短时间显示：DurationShort）
 * @result
 */
+ (void)showToast:(NSString *)msg withGravity:(ToastAlignEnum)align offsetLeft:(NSInteger)left offsetTop:(NSInteger)top andDuration:(ToastDurationEnum)duration {
    [[XMsg si] showToast:msg withGravity:align offsetLeft:left offsetTop:top andDuration:duration];
}


/**
 * 显示进度
 * 在对应的视图当中显示进度视图
 * @result
 */
+ (void)showProgress {
    [[XMsg si] showProgressWithTitle:nil];
}


/**
 * 显示进度
 * 在对应的视图当中显示进度视图
 * @param   title           需要显示的提示文字信息
 * @result
 */
+ (void)showProgressWithTitle:(NSString *)title {
    [[XMsg si] showProgressWithTitle:title];
}


/**
 * 隐藏进度
 * 隐藏对应的视图当何总显示的进度视图
 * @result
 */
+ (void)hideProgress {
    [[XMsg si] hideProgress];
}


/**
 * 简单选项模式（只有一行文字的选项框）
 * @param        title，弹出框对应的标题信息
 * @param        items，选项数组，每个元素为一个字符串NSString，作为item的标题显示出来
 * @param        delegate，处理选项选中后的回调对象，对象当中需实现 - (void)selectItem:(NSString*)title index:(NSUInteger)uIndex 方法
 * @result
 */
+ (void)showSelector:(NSString*)title
           withItems:(NSArray*)items
            delegate:(id/*<ItemsSelectorDelegate>*/)delegate {
    [XSelector showSelector:title withItems:items delegate:delegate];
}


/**
 * 简单选项模式-词典元素（只有一行文字的选项框）
 * @param        title，弹出框对应的标题信息
 * @param        items，选项数组，每个元素为一个词典数据，根据传入的Key，获取相应的字段，作为item的标题显示出来
 * @param        key，词典元素对应的Key值，根据该Key值获取词典元素当中对应的字段，作为item的标题显示出来
 * @param        delegate，处理选项选中后的回调对象，对象当中需实现 - (void)selectItem:(NSString*)title index:(NSUInteger)uIndex 方法
 * @result
 */
+ (void)showSelector:(NSString*)title
        withDicItems:(NSArray*)items
              andKey:(NSString*)key
            delegate:(id/*<ItemsSelectorDelegate>*/)delegate {
    [XSelector showSelector:title withDicItems:items andKey:key delegate:delegate];
}


/**
 * 简单选项模式-词典元素（只有一行文字的选项框）
 * @param        title，弹出框对应的标题信息
 * @param        items，选项数组，每个元素为一个字典NSDictionary 含有对象：
 *                      KEY             值类型                 说明
 *                      Title           NSString              选项名称，将作为item的标题显示（不能为空）
 *                      Image           UIImage               列表当中显示的图片（可选）
 *                      Detail          NSString              详情信息（可选）
 * @param        key，词典元素对应的Key值，根据该Key值获取词典元素当中对应的字段，作为item的标题显示出来
 * @param        delegate，处理选项选中后的回调对象，对象当中需实现 - (void)selectItem:(NSString*)title index:(NSUInteger)uIndex 方法
 * @result
 */
+ (void)showDetailSelector:(NSString*)title
                 withItems:(NSArray*)items
                  delegate:(id/*<ItemsSelectorDelegate>*/)delegate {
    [XSelector showDetailSelector:title withItems:items delegate:delegate];
}


@end
